Java、JDKをインストールせずに使ったり捨てたり
概要
ろくなアンインストーラが無い上にあなたとJavaインストーラは変な挙動するので本当にJavaインストールしたくない。
結論として、あなたとJavaを見ずにJavaをそのへんに入れたり捨てたりが容易にできるようになった。
なので正しい題としては、「あなたとJavaを見ずにJavaをそのへんのフォルダにインストールする」になる。
ある程度の経緯
ホストマシン(Mac)にJavaをインストールすると通知とか管理が本当にウザいので、
JDKをDocker側に入れてホストマシンからはそれを使うようにしたい。という感じで考えていた。
Dockerをつかってどうこうするのはまあよく考えたら無理で、代替を探していろいろやった話。
そのうちもっとちゃんと隔離したい。
今回の用途、Dockerだとなぜ適さなかったのか
Dockerの-vでのボリュームだと、
・Macの特定のフォルダ以下のパスを
・Dockerのコンテナの特定のフォルダに接続する
ということをしていて、まあ、想定されているアクセス方向としては
アクセス方向 ->
Docker(
特定path ->
Mac(
特定path
)
)
という、「DockerからMacの特定パスにアクセスできる」という機能なわけで、
今回自分が欲しかったのは下記。
アクセス方向 ->
Mac(
特定path ->
Docker(
特定path(ここにJava入れて云々)
)
)
で、まあ、これはDockerコンテナの仕事ではなく、ホストOSに対するパーティショニングみたいな概念で、
そもそもDockerじゃなくてもいいじゃんみたいな感じに落ち着いた。Javaまわりいろいろ多いので、できれば隔離したかった。
戦略としては、
・Macの特定フォルダ以下にJDKが入ったフォルダを置く
だけ。
まずJDKインストーラを分解します
できればOracleのサイトから何かDLするのすらやりたくなかったんだけど、
こればっかりはしょうがないのでOracleのサイトからJDKのインストーラをDLしてくる。
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
dmgしかない。ここにtarなどがあればここからの苦労は本当に必要ない。ちなみにJREはtarで配布されてる。なぜなの。
分解工程
まずはどこでもいいので、tmpフォルダを用意して、その中にJDKのインストーラを分解したものを出力
mkdir tmp
この状態で、DLしてきたJDKのdmgをダブルクリックし、/Volumeでアクセスできるようにする。
デスクトップにこういうのが表示された状態で、packageutilを使ってインストーラの中身をtmp内に展開する。
cd tmp
pkgutil --expand /Volumes/JDK\ 8\ Update\ 111/JDK\ 8\ Update\ 111.pkg ./jdkpkg
これで、JDKの中身がtmpフォルダに展開される。
さらにpkgが出てきたので分解する。
javaappletまだ積んでるのか。そちらは要らないので無視する。
jdk180111.pkgを分解する。
なんでpkgからpkg出てくるんだろ?っていう疑念は当たりで、このpkgに対してpkgutilを使うと失敗する。
で、
これは拡張子はpkgなんだけどどうやらpkgではないという。なにしてんの。
いろいろ探してたら先駆者がいた。先駆者の人たちどんな気持ちでこのテクニックにたどり着いたんだろう。
How to install java 7 on mac in custom location?
http://stackoverflow.com/questions/15217200/how-to-install-java-7-on-mac-in-custom-location
というわけで、このpkgはこれ、pkgではなくGZipされたCPIOファイルだそうで。へぇ。なんで.pkgなんだ、、、
cpio -i < ./jdkpkg/jdk180111.pkg/Payload
やったぜ。
無事javaがそのへんに置けましたね。よかったよかった。
これでおもしろインストーラを一切実行せずに、ホスト環境を汚されずに済む。そして捨てやすい。
使い方
いちいち下記をやってもいいし、
export JAVA_HOME=どこか/tmp/Contents/Home/
bashrcとかをいじってもいいと思う。
自分は必要な時だけ必要なので、これでいい。
動くの?
動くよ。
注意点
extractしたHomeディレクトリの奥深くに、Java Mission Control.appというAppが入っているので、
使わない場合は消せばいいと思う。
自分は存在に気づかなかったが確かにあって、用途を鑑みるにろくでもないものをインストールしそうだったので消した。